home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-05 / src_1218.zip / TTYLINK.C < prev    next >
C/C++ Source or Header  |  1991-01-27  |  2KB  |  109 lines

  1. /* Internet TTY "link" (keyboard chat) server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "telnet.h"
  9. #include "session.h"
  10. #include "proc.h"
  11. #include "tty.h"
  12. #include "mailbox.h"
  13. #include "commands.h"
  14.  
  15. static int Sttylink = -1;    /* Protoype socket for service */
  16.  
  17. int
  18. ttylstart(argc,argv,p)
  19. int argc;
  20. char *argv[];
  21. void *p;
  22. {
  23.     struct sockaddr_in lsocket;
  24.     int s,type;
  25.  
  26.     if(Sttylink != -1){
  27.         return 0;
  28.     }
  29.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  30.     chname(Curproc,"TTYlink listener");
  31.  
  32.     lsocket.sin_family = AF_INET;
  33.     lsocket.sin_addr.s_addr = INADDR_ANY;
  34.     if(argc < 2)
  35.         lsocket.sin_port = IPPORT_TTYLINK;
  36.     else
  37.         lsocket.sin_port = atoi(argv[1]);
  38.  
  39.     Sttylink = socket(AF_INET,SOCK_STREAM,0);
  40.     bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
  41.     listen(Sttylink,1);
  42.     for(;;){
  43.         if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
  44.             break;    /* Service is shutting down */
  45.         
  46.         if(availmem() < Memthresh){
  47.             usprintf(s,"System is overloaded; try again later\n");
  48.             shutdown(s,1);
  49.         } else {
  50.             type = TELNET;
  51.             newproc("chat",2048,ttylhandle,s,(void *)&type,NULL,0);
  52.         }
  53.     }
  54.     return 0;
  55. }
  56. /* This function handles all incoming "chat" sessions, be they TCP,
  57.  * NET/ROM or AX.25
  58.  */
  59. void
  60. ttylhandle(s,t,p)
  61. int s;
  62. void *t;
  63. void *p;
  64. {
  65.     int type,index;
  66.     struct session *sp;
  67.     char addr[MAXSOCKSIZE];
  68.     int len = MAXSOCKSIZE;
  69.     struct telnet tn;
  70.  
  71.     type = * (int *)t;
  72.     sockmode(s,SOCK_ASCII);
  73.     sockowner(s,Curproc);    /* We own it now */
  74.     log(s,"open %s",Sestypes[type]);
  75.  
  76.     /* Allocate a session descriptor */
  77.     if((sp = newsession(NULLCHAR,type)) == NULLSESSION){
  78.         usprintf(s,"Too many sessions\n");
  79.         close_s(s);
  80.         return;
  81.     }
  82.     index = sp - Sessions;
  83.  
  84.     /* Initialize a Telnet protocol descriptor */
  85.     memset((char *)&tn,0,sizeof(tn));
  86.     tn.session = sp;    /* Upward pointer */
  87.     sp->cb.telnet = &tn;    /* Downward pointer */
  88.     sp->s = s;
  89.     sp->proc = Curproc;
  90.  
  91.     getpeername(s,addr,&len);
  92.     tprintf("\007Incoming %s session %u from %s\007\n",
  93.      Sestypes[type],index,psocket(addr));
  94.  
  95.     tnrecv(&tn);
  96. }
  97.  
  98. /* Shut down Ttylink server */
  99. int
  100. ttyl0(argc,argv,p)
  101. int argc;
  102. char *argv[];
  103. void *p;
  104. {
  105.     close_s(Sttylink);
  106.     Sttylink = -1;
  107.     return 0;
  108. }
  109.